#include "mwin.h"
#include "ui_mwin.h"
#include <QUrl>
#include <QDebug>
#include <QMessageBox>
#define CFGNAME "rezervilo.cfg"

MWin::MWin(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MWin)
{
    ui->setupUi(this);

    this->statusBar()->addWidget(&stlabel);

    this->hash="";
    this->usertype=0;
    this->username="";
    QSettings cfg(QCoreApplication::applicationDirPath()+"/"+CFGNAME,QSettings::IniFormat);

    this->xmlclient = new xmlrpc::Client();
    this->xmlclient->setHost(cfg.value("server","").toString(),
                             cfg.value("port",5555).toInt());
    connect(this->xmlclient,SIGNAL(done(int,QVariant)),this,SLOT(slotDone(int,QVariant)));
    connect(this->xmlclient,SIGNAL(failed(int,int,QString)),this,SLOT(slotFail(int,int,QString)));
}

MWin::~MWin()
{
    delete ui;
}

void MWin::start(){
// запускаем главное окно =) сначала пробуем залогиниться на сервере, к которому уже подключились
    LogonDialog dia;
    if(dia.exec()){
        // вызываем процедуру авторизации
        QList<xmlrpc::Variant> params;
        params.append(dia.getLogin());
        this->username=dia.getLogin();
        params.append(dia.getPassword());
        this->logonKey=false;
        this->id_logon = this->xmlclient->request("logon",params);
        while(!this->logonKey){
//            sleep(1);
//            QApplication::processEvents();
            QTime dieTime= QTime::currentTime().addSecs(1);
            while( QTime::currentTime() < dieTime )
            QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
        }
    }else{
        exit(0);
    }

}

void MWin::slotDone(int id, QVariant variant){

    qDebug()<<"DONE -- "<<id<<" -- "<<variant;

    // ловим ответ от авторизации
    if(this->id_logon == id){
        // выставляем ключь авторизации и смотрим что пришло от сервера.
        this->logonKey=true;
        qDebug()<<"server return logon, hash"<<variant.toList().at(0).toString()<<" usertype "<<variant.toList().at(1).toInt();
        this->hash=variant.toList().at(0).toString();
        this->usertype=variant.toList().at(1).toInt();
        // судя по всему авторизация пройдена
        // подготавливаем окно и показываем его
        this->ui->stackedWidget->setCurrentIndex(this->usertype);
        switch(this->usertype){
        case 0:
            this->setWindowTitle(tr("Manager - %1").arg(this->username));
            break;
        case 1:
            this->setWindowTitle(tr("Administrator - %1").arg(this->username));
            this->ui->tabWidget->setCurrentIndex(0);
            this->ui->tabWidget->setEnabled(false);
            this->stlabel.setText(tr("Query users list"));
            {
            // долбаная кроссинициализация =)
            QList<xmlrpc::Variant> np;
            np.append(this->username);
            np.append(this->hash);
            this->id_getuserslist = this->xmlclient->request("getuserslist",np);
            }
            break;
        default:
            break;
        }
        this->show();
    }
    if(this->id_getuserslist == id){
        qDebug()<<"getuserslist";

    }
}

void MWin::slotFail(int id, int errcode, QString errstr){
    qDebug()<<"DEBUG ERROR "<<errcode<<" - "<<errstr;
    // ловим ошибку авторизации
    if(this->id_logon == id){

        this->logonKey=true;
        QMessageBox::critical(this,tr("Error"),
                              tr("Error message from server:\n")+
                              QString("%1 - %2\n").arg(errcode).arg(errstr)+tr("exit."));
        exit(errcode);
    }
    // ловим ошибку получения списка пользователей
    if(this->id_getuserslist == id){
        QMessageBox::critical(this,tr("Error"),
                              tr("Error message from server:\n")+
                              QString("%1 - %2\n").arg(errcode).arg(errstr)+tr("exit."));
        exit(errcode);
    }

}
